package com.shujia.spark

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo7ReduceByKey {
  def main(args: Array[String]): Unit = {

    /**
      * map  传入一行返回一行
      *
      */
    //创建sparkp配置文件对象
    val conf = new SparkConf().setAppName("map").setMaster("local")

    //上下文对象
    val sc = new SparkContext(conf)


    //读取文件构建RDD
    val studentRDD: RDD[String] = sc.textFile("spark/data/students.txt")

    val kvRDD = studentRDD.map(line => {
      val split = line.split(",")
      val clazz = split(4)
      (clazz, 1)
    })

    /**
      * reduceByKey
      * 1、对key进行分组
      * 2、对每一个key的value进行聚合
      *
      *
      * 能够通过reduceByKey实现的功能  通过groupByKey一样可以实现
      *
      * reduceByKey比groupByKey速度快
      *
      * reduceByKey 和 groupByKey   都会产生shuffle
      * 都需要将同一个个key的数据拉去到同一个reduce中进行聚合
      *
      * reduceByKey  会在map进行预聚合   shuffle过程中需要拉去的数据量减少
      *
      */

    kvRDD.reduceByKey((i, j) => i + j).foreach(println)


    kvRDD.groupByKey().map(kv => (kv._1, kv._2.toList.sum)).foreach(println)

  }
}
